home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1993 / Internet Info CD-ROM (Walnut Creek) (1993).iso / networking / ip / ka9q / aztecnos.arc / KSUBR.C < prev    next >
Encoding:
C/C++ Source or Header  |  1989-03-20  |  5.1 KB  |  187 lines

  1. /* Machine or compiler-dependent portions of kernel */
  2. #include "global.h"
  3. #include "proc.h"
  4.  
  5. extern char Intstk[];
  6. extern unsigned short dbase,cbase;
  7.  
  8. #if    (sizeof(int (*)()) == 4)
  9. #define    LARGECODE    1
  10. #endif
  11.  
  12. /* Segment number of pointer */
  13. #define    FP_SEG(x)    (sizeof(x) == 4 ? ((long)(x) >> 16) : dbase)
  14. /* Offset of pointer */
  15. #define FP_OFF(x)    ((unsigned short)((long)(x) & 0xffff))
  16.  
  17.  
  18. /* Template for contents of jmp_buf in Aztec C */
  19. struct env {
  20.     unsigned short sp;    /* Stack pointer */
  21.     unsigned short bp;    /* Context pointer */
  22.     unsigned short si;    /* Register variables */
  23.     unsigned short di;
  24.     unsigned short ip;    /* Program counter */
  25.     unsigned short cs;    /* Code segment -- only in large code model */
  26. };
  27.  
  28. kinit()
  29. {
  30.     /* Initialize interrupt stack for high-water-mark checking */
  31.     memset(Intstk,STACKPAT,512);
  32.  
  33.     /* Init location 0 with pattern to detect null pointer derefs */
  34.     *(unsigned short *)NULL = NULLPAT;    
  35. }
  36. /* Print process table info
  37.  * Since things can change while ps is running, the ready proceses are
  38.  * displayed last. This is because an interrupt can make a process ready,
  39.  * but a ready process won't spontaneously become unready. Therefore a
  40.  * process that changes during ps may show up twice, but this is better
  41.  * than not having it showing up at all.
  42.  */
  43. int
  44. ps()
  45. {
  46.     register struct proc *pp;
  47.     register struct env *ep;
  48.     int i;
  49.  
  50.     printf("Code %x Data %x Stack %x max intstk %u\n",cbase,dbase,getss(),chkintstk());
  51.  
  52.     printf("PID       SP        stksize   maxstk    event     flags     name\n");
  53.  
  54.     for(pp = Susptab;pp != NULLPROC;pp = pp->next){
  55.         ep = (struct env *)&pp->env;
  56.         printf("%-10lx%-10x%-10u%-10u%-10lx%c%c%c       %s\n",
  57.          ptol(pp),
  58.          ep->sp,
  59.          pp->stksize,
  60.          stkutil(pp),
  61.          ptol(pp->event),
  62.          pp->i_state ? 'I' : ' ',
  63.          (pp->state & WAITING) ? 'W' : ' ',
  64.          (pp->state & SUSPEND) ? 'S' : ' ',
  65.          pp->name);
  66.     }
  67.     for(i=0;i<PHASH;i++){
  68.         for(pp = Waittab[i];pp != NULLPROC;pp = pp->next){
  69.             ep = (struct env *)&pp->env;
  70.             printf("%-10lx%-10x%-10u%-10u%-10lx%c%c%c       %s\n",
  71.              ptol(pp),ep->sp,pp->stksize,stkutil(pp),
  72.              ptol(pp->event),
  73.              pp->i_state ? 'I' : ' ',
  74.              (pp->state & WAITING) ? 'W' : ' ',
  75.              (pp->state & SUSPEND) ? 'S' : ' ',
  76.              pp->name);
  77.         }
  78.     }
  79.     for(pp = Rdytab;pp != NULLPROC;pp = pp->next){
  80.         ep = (struct env *)&pp->env;
  81.         printf("%-10lx%-10x%-10u%-10u          %c%c%c       %s\n",
  82.          ptol(pp),ep->sp,pp->stksize,stkutil(pp),
  83.          pp->i_state ? 'I' : ' ',
  84.          (pp->state & WAITING) ? 'W' : ' ',
  85.          (pp->state & SUSPEND) ? 'S' : ' ',
  86.          pp->name);
  87.     }
  88.     if(Curproc != NULLPROC){
  89.         ep = (struct env *)&Curproc->env;
  90.         printf("%-10lx%-10x%-10u%-10u           %c        %s\n",
  91.          ptol(Curproc),ep->sp,Curproc->stksize,
  92.          stkutil(Curproc),
  93.          Curproc->i_state ? 'I' : ' ',
  94.          Curproc->name);
  95.     }
  96.     return 0;
  97. }
  98. int
  99. stkutil(pp)
  100. struct proc *pp;
  101. {
  102.     unsigned i;
  103.     register char *sp;
  104.  
  105.     i = pp->stksize;
  106.     for(sp = pp->stack;*sp == STACKPAT && sp < pp->stack + pp->stksize;sp++)
  107.         i--;
  108.     return i;
  109. }
  110. /* Return number of used bytes in interrupt stack. Note hardwired value
  111.  * of 512; this is also found in the various .asm files
  112.  */
  113. chkintstk()
  114. {
  115.     register int i;
  116.     register char *cp;
  117.  
  118.     i = 512;
  119.     for(cp = Intstk; *cp == STACKPAT && cp < &Intstk[512]; cp++)
  120.         i--;
  121.     return i;
  122. }
  123.  
  124. /* Verify that stack pointer for specified process is within legal limits;
  125.  * also check that no one has dereferenced a null pointer
  126.  */
  127. void
  128. chkstk(pp)
  129. struct proc *pp;
  130. {
  131.     register struct env *ep;
  132.     unsigned short sbase,stop;
  133.  
  134.     if(pp == NULLPROC)
  135.         return;
  136.     ep = (struct env *) &pp->env;
  137.     sbase = (unsigned short) pp->stack;
  138.     stop = sbase + pp->stksize;
  139.     if(ep->sp < sbase || ep->sp >= stop){
  140.         printf("Stack violation, process %s\n",pp->name);
  141.         printf("SP = %x, legal stack range [%x,%x)\n",ep->sp,sbase,stop);
  142.         killproc(pp);
  143.     }
  144.     if(*(unsigned short *)NULL != NULLPAT){
  145.         printf("WARNING: Location 0 smashed, process %s\n",pp->name);
  146.         *(unsigned short *)NULL = NULLPAT;
  147.     }
  148. }
  149. /* Machine-dependent initialization of a task */
  150. psetup(pp,iarg,parg,pc)
  151. struct proc *pp;    /* Pointer to task structure */
  152. int iarg;        /* Integer argument */
  153. char *parg;        /* Generic pointer argument */
  154. void (*pc)();        /* Initial execution address */
  155. {
  156.     register int *stktop;
  157.     register struct env *ep;
  158.  
  159.     /* Set up stack to make it appear as if the user's function was called
  160.      * by killself() with the specified arguments. When the user returns,
  161.      * killself() automatically cleans up.
  162.      *
  163.      * First, push args on stack in reverse order, simulating what C
  164.      * does just before it calls a function.
  165.      */
  166.     stktop = (int *)(pp->stack + pp->stksize);
  167.     *--stktop = (int)parg;
  168.     *--stktop = iarg;
  169.         
  170.     /* Now push the entry address of killself(), simulating the call to
  171.      * the user function.
  172.      */
  173. #ifdef    LARGECODE
  174.     *--stktop = FP_SEG(&killself);
  175. #endif
  176.     *--stktop = FP_OFF(&killself);
  177.  
  178.     /* Set up environment in jmp buf */
  179.     ep = (struct env *)&pp->env;
  180.     ep->sp = FP_OFF(stktop);
  181.     ep->cs = FP_SEG(pc);    /* Doesn't hurt in small model */
  182.     ep->ip = FP_OFF(pc);
  183.     /* Task initially runs with interrupts on */
  184.     pp->i_state = 1;
  185. }
  186.  
  187.